/*----------------------------------------------------------
* FILE: Dao.java
* LOGICAL NAME: Dao
* PRODUCT: bila-framework
*----------------------------------------------------------
* MODIFICATIONS
* DATE Aug 25, 2011
* AUTHOR wjuarez
*----------------------------------------------------------
*/

package bila.framework.dao;

import java.io.Serializable;
import java.util.List;

/**
 * @author WJuarez
 * <b>Created by </b>wjuarez
 * <b>for</b> bila-framework
 * <b>package</b> bila.framework.dao
 * <b>on</b> Aug 25, 2011 11:07:26 PM
 * <b>Purpose</b> 
 * <p>
 *		Interfaz de DAO generico que posee los metodos de CRUD
 *		mas algunos metodos de apoyo
 * </p>
 */
public interface Dao<Model, ModelId extends Serializable> extends DaoFinder<Model, ModelId>{

	/**
	 * Genera un nuevo registro en la base de datos
	 * @param model objeto a guardar
	 * @throws Exception
	 */
	public void save(Model model) throws Exception;
	
	/**
	 * Actualiza un registro, para que este metodo funcione
	 * debe poseer los atributos de su llave primaria
	 * @param model objeto a actualizar
	 * @throws Exception
	 */
	public void update(Model model) throws Exception;
	
	/**
	 * Elimina un registro, para que este metodo funcione
	 * debe poseer los atributos de su llave primaria
	 * @param model objeto a eliminar
	 * @throws Exception
	 */
	public void delete(Model model) throws Exception;
	
	/**
	 * Metodo que verifica si el objeto ya existe en la base de datos
	 * de ser asi lo guarda como uno nuevo, en caso contrario
	 * actualiza la informacion con los valores que posee el objeto Modelo
	 * @param model objeto a guardar/actualizar
	 * @throws Exception
	 */
	public void saveOrUpdate(Model model) throws Exception;
	
	/**
	 * Guarda o actualiza si el registro ya existe
	 * todos los elementos que se encuentran en la lista.
	 * La lista debe ser de tipo List<Model>
	 * @param list listado de objetos modelos que desean guardarse o actualizarse
	 * @throws Exception
	 */
	public void saveOrUpdateList(List<Model> list) throws Exception;
	
	/**
	 * Elimina un listado de objetos Model
	 * @param list lista con los objetos que se desean eliminar
	 * @throws Exception
	 */
	public void deleteList(List<Model> list) throws Exception;
	
}
